home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ABUSESRC.ZIP / AbuseSrc / imlib / port / x11 / event.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-30  |  7.4 KB  |  252 lines

  1. #include "system.h"
  2. #include "xinclude.h"
  3. #include "image.hpp"
  4. #include "palette.hpp"
  5. #include "mdlread.hpp"
  6. #include "video.hpp"
  7. #include "gifread.hpp"
  8. #include "macs.hpp"
  9. #include "mouse.hpp"
  10. #include "event.hpp"
  11. #include "sprite.hpp"
  12. #include "xinclude.h"
  13.  
  14.  
  15. extern Display *display;
  16. extern int screen_num;
  17. extern Screen *screen_ptr;
  18. extern Window mainwin;
  19. extern int pixel_scale;
  20.  
  21. int showkeys = 0;
  22.  
  23. void event_handler::flush_screen()
  24. {
  25.   update_dirty(screen);
  26. }
  27.  
  28. int event_handler::get_key_flags()
  29. {
  30.   Window w1,w2;
  31.   int j;
  32.   unsigned mask;
  33.   XQueryPointer(display,mainwin,&w1,&w2,&j,&j,&j,&j,&mask);
  34.   return ((mask&ShiftMask)!=0)<<3 | ((mask&ControlMask)!=0)<<2 |
  35.      ((mask&8)!=0)<<1;
  36. }
  37.  
  38.  
  39. int event_handler::event_waiting()
  40. {
  41.   if (ewaiting) return 1;
  42.   if (XPending(display))
  43.     ewaiting=1;
  44. /*  else if (last_keystat!=get_key_flags())
  45.     ewaiting=1;*/
  46.   return ewaiting;
  47. }
  48.  
  49. event_handler::event_handler(image *screen, palette *pal)
  50. {
  51.     extern int start_argc;
  52.     extern char **start_argv;
  53.   int i;
  54.   CHECK(screen && pal);
  55.   mouse=new JCMouse(screen,pal);
  56.   mhere=mouse->exsist();
  57.   last_keystat=get_key_flags();
  58.   XSelectInput(display,mainwin,
  59.     KeyPressMask | VisibilityChangeMask | ButtonPressMask | ButtonReleaseMask |
  60.     ButtonMotionMask | PointerMotionMask | KeyReleaseMask |
  61.     ExposureMask | StructureNotifyMask);
  62.   mhere=1;
  63.   ewaiting=0;
  64.   for (i=0 ; i<start_argc ; i++)
  65.     if (!strcmp(start_argv[i], "-showkeys"))
  66.       showkeys = 1;
  67. }
  68.  
  69. void event_handler::get_event(event &ev)
  70. {
  71.   int kf,kf_change=0;
  72.   event *ep;
  73.   while (!ewaiting)
  74.     event_waiting();
  75.  
  76.   ep=(event *)events.first();
  77.   if (ep)
  78.   { ev=*ep;
  79.     events.unlink((linked_node *)ep);
  80.     delete ep;
  81.     ewaiting=events.first()!=NULL;
  82.   }
  83.   else
  84.   {
  85.     // note : that the mouse status
  86.     // should be know even if
  87.     // other event has occured
  88.     ev.mouse_move.x=mouse->x();
  89.     ev.mouse_move.y=mouse->y();
  90.     ev.mouse_button=mouse->button();
  91.  
  92. /*    kf=get_key_flags();
  93.     if (kf!=last_keystat)
  94.     { last_keystat=kf;
  95.       kf_change=1;
  96.       ev.type=EV_KEY_SPECIAL;
  97.       ev.key_special.shift=kf&2;
  98.       ev.key_special.ctrl=kf&4;
  99.       ev.key_special.alt=kf&8;
  100.     } */
  101.  
  102.     XEvent xev;
  103.     image *n;
  104.     int np,ij,sp;
  105.     linked_node *pagep;
  106.     if (XPending(display))
  107.     {
  108.       XNextEvent(display,&xev);
  109.       ev.window=(jwindow *)xev.xany.window;
  110.       switch (xev.type)
  111.       { 
  112.         case ConfigureNotify :
  113.      {
  114.           if (pixel_scale == 1 && xev.xany.window==mainwin && (screen->width()!=xev.xconfigure.width || 
  115.         screen->height()!=xev.xconfigure.height))
  116.           {
  117.         XFlush(display);
  118.         int new_width=xev.xconfigure.width&~3;  // must be word alligned
  119.         if (new_width!=xev.xconfigure.width)
  120.           XResizeWindow(display,mainwin,new_width,xev.xconfigure.height);
  121.  
  122.         screen->change_size(new_width,xev.xconfigure.height);
  123.         screen->clear_dirties();
  124.         screen->clear();
  125.  
  126.             xres=screen->width()-1;
  127.             yres=screen->height()-1;
  128.             ev.type=EV_RESIZE;
  129.           }
  130.           else 
  131.         ev.type=EV_SPURIOUS;
  132.         } break;
  133.           
  134.         case Expose :
  135.         { ev.type=EV_REDRAW;
  136.           ev.redraw.x1=xev.xexpose.x;
  137.           ev.redraw.y1=xev.xexpose.y;
  138.           ev.redraw.x2=ev.redraw.x1+xev.xexpose.width;
  139.           ev.redraw.y2=ev.redraw.y1+xev.xexpose.height;
  140.           ev.redraw.start=NULL;
  141.         } break;
  142.         case KeyPress :
  143.         case KeyRelease :
  144.         {
  145.           if (!kf_change)  // if the key flags changed, it's not a real key
  146.           {
  147.             char buf;
  148.             KeySym ks;
  149.             XLookupString(&xev.xkey,&buf,1,&ks,NULL); 
  150.             if (xev.type==KeyPress)
  151.             {
  152.               ev.type=EV_KEY; 
  153.               if (showkeys)
  154.                 fprintf(stderr, "keysym 0x%x\n", ks);
  155.             }
  156.             else ev.type=EV_KEYRELEASE;
  157.             switch (ks)
  158.             { case XK_Down :         ev.key=JK_DOWN; break;
  159.               case XK_Up :          ev.key=JK_UP;  break;
  160.               case XK_Left :         ev.key=JK_LEFT;  break;
  161.               case XK_Right :         ev.key=JK_RIGHT;  break;
  162.               case XK_Control_L :     ev.key=JK_CTRL_L;  break;
  163.               case XK_Control_R :     ev.key=JK_CTRL_R;  break;
  164.               case XK_Execute :     ev.key=JK_CTRL_R;  break;
  165.               case XK_Alt_L :         ev.key=JK_ALT_L;  break;
  166.               case XK_Alt_R :         ev.key=JK_ALT_R;  break;
  167.               case XK_Shift_L :     ev.key=JK_SHIFT_L;  break;
  168.               case XK_Shift_R :     ev.key=JK_SHIFT_R;  break;
  169.               case XK_Num_Lock :     ev.key=JK_NUM_LOCK;  break;
  170.               case XK_Home :         ev.key=JK_HOME;  break;
  171.               case XK_End :         ev.key=JK_END;  break;
  172.               case XK_BackSpace :    ev.key=JK_BACKSPACE;  break;
  173.               case XK_Tab :        ev.key=JK_TAB;  break;
  174.               case XK_Return :        ev.key=JK_ENTER;  break;
  175.               case XK_Caps_Lock :    ev.key=JK_CAPS;  break;
  176.               case XK_Escape :        ev.key=JK_ESC;  break;
  177.               case XK_F1 :              ev.key=JK_F1; break;
  178.               case XK_F2 :              ev.key=JK_F2; break;
  179.               case XK_F3 :              ev.key=JK_F3; break;
  180.               case XK_F4 :              ev.key=JK_F4; break;
  181.               case XK_F5 :              ev.key=JK_F5; break;
  182.               case XK_F6 :              ev.key=JK_F6; break;
  183.               case XK_F7 :              ev.key=JK_F7; break;
  184.               case XK_F8 :              ev.key=JK_F8; break;
  185.               case XK_F9 :              ev.key=JK_F9; break;
  186.               case XK_F10 :             ev.key=JK_F10; break;
  187.           case XK_Insert :          ev.key=JK_INSERT; break;
  188.           case XK_KP_0 :          ev.key=JK_INSERT; break;
  189.           case XK_Page_Up :         ev.key=JK_PAGEUP; break;
  190.           case XK_Page_Down :       ev.key=JK_PAGEDOWN; break;
  191.               default :
  192.                if (buf)
  193.                {
  194.                  ev.key=(int)buf;
  195.                }
  196.                else ev.type=EV_SPURIOUS;
  197.             }
  198.           }
  199.         } break;
  200.         case MotionNotify : 
  201.         {
  202.           mouse->update(xev.xmotion.x/pixel_scale,xev.xmotion.y/pixel_scale,mouse->button());
  203.           ev.type=EV_MOUSE_MOVE;
  204.           ev.mouse_move.x=mouse->x();
  205.           ev.mouse_move.y=mouse->y();
  206.         } break;
  207.         case ButtonRelease :
  208.         { switch (xev.xbutton.button)
  209.           { case 1 : ev.mouse_button&=(0xff-1); break;
  210.             case 2 : ev.mouse_button&=(0xff-4); break;
  211.             case 3 : ev.mouse_button&=(0xff-2); break;
  212.           }
  213.         } // no break here please...
  214.         case ButtonPress :
  215.         { 
  216.           if (xev.type==ButtonPress)
  217.           { switch (xev.xbutton.button)
  218.             { case 1 : ev.mouse_button|=1; break;
  219.               case 2 : ev.mouse_button|=4; break;
  220.               case 3 : ev.mouse_button|=2; break;
  221.             }
  222.           }
  223.           mouse->update(mouse->x(),mouse->y(),ev.mouse_button);
  224.           ev.type=EV_MOUSE_BUTTON;
  225.           ev.mouse_move.x=mouse->x();
  226.           ev.mouse_move.y=mouse->y();
  227.         } break;
  228.       }
  229.     }
  230.     ewaiting=0;
  231.   }
  232. }
  233.  
  234.  
  235. void event_handler::add_redraw(int X1, int Y1, int X2, int Y2, void *Start)
  236. {
  237.   event *ev;
  238.   ev=new event;
  239.   ev->type=EV_REDRAW;
  240.   ev->redraw.x1=X1; ev->redraw.x2=X2;
  241.   ev->redraw.y1=Y1; ev->redraw.y2=Y2; ev->redraw.start=Start;
  242.   events.add_end((linked_node *)ev);
  243. }
  244.  
  245. event_handler::~event_handler() { delete mouse; }
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.